/*!
 * \file WtCtaStraFact.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader CTA策略工厂头文件
 * 
 * \details 该文件定义了WtStraFact类，实现CTA策略工厂接口，负责：
 *          - CTA策略的创建和销毁
 *          - 策略名称枚举和管理
 *          - 工厂名称标识
 *          - 策略实例生命周期管理
 *          
 *          支持的策略类型：
 *          - DualThrust双推策略
 *          - 其他自定义CTA策略
 *          
 *          作为插件化策略管理的核心组件，支持动态加载和策略扩展
 */

#pragma once
#include "../Includes/CtaStrategyDefs.h"

USING_NS_WTP;

/*!
 * \class WtStraFact
 * \brief WonderTrader CTA策略工厂
 * 
 * \details 该类实现了ICtaStrategyFact接口，提供CTA策略的工厂管理功能：
 *          
 *          核心功能：
 *          - 策略创建：根据策略名称和ID创建具体策略实例
 *          - 策略销毁：安全释放策略实例资源
 *          - 策略枚举：遍历工厂支持的所有策略类型
 *          - 工厂标识：提供唯一的工厂名称标识
 *          
 *          设计模式：
 *          - 工厂模式：封装策略创建逻辑
 *          - 插件模式：支持动态加载和扩展
 *          - RAII模式：自动管理策略生命周期
 *          
 *          支持策略：
 *          - "DualThrust"：双推策略，适用于趋势跟踪
 *          - 可扩展更多自定义策略类型
 * 
 * \note 该工厂类主要用于CTA策略的统一管理和创建
 * \see ICtaStrategyFact, CtaStrategy, WtStraDualThrust
 */
class WtStraFact : public ICtaStrategyFact
{
public:
	/*!
	 * \brief 构造函数
	 */
	WtStraFact();
	
	/*!
	 * \brief 析构函数
	 */
	virtual ~WtStraFact();

public:
	/*!
	 * \brief 获取工厂名称
	 * \return 工厂名称字符串
	 * 
	 * \details 返回该工厂的唯一标识名称，用于区分不同的策略工厂
	 */
	virtual const char* getName() override;

	/*!
	 * \brief 创建策略实例
	 * \param name 策略名称（如"DualThrust"）
	 * \param id 策略实例ID，用于区分同一策略的不同实例
	 * \return 创建的策略实例指针，失败返回nullptr
	 * 
	 * \details 根据指定的策略名称创建对应的策略实例：
	 *          - 支持的策略名称通过enumStrategy方法获取
	 *          - 每个策略实例具有唯一的ID标识
	 *          - 创建失败时返回nullptr，调用者需要检查返回值
	 */
	virtual CtaStrategy* createStrategy(const char* name, const char* id) override;

	/*!
	 * \brief 枚举工厂支持的策略
	 * \param cb 枚举回调函数，用于接收策略名称
	 * 
	 * \details 遍历工厂支持的所有策略类型，通过回调函数返回策略名称：
	 *          - 回调函数格式：void callback(const char* strategyName)
	 *          - 可用于策略列表展示和动态配置
	 */
	virtual void enumStrategy(FuncEnumStrategyCallback cb) override;

	/*!
	 * \brief 删除策略实例
	 * \param stra 要删除的策略实例指针
	 * \return 删除成功返回true，失败返回false
	 * 
	 * \details 安全删除策略实例并释放相关资源：
	 *          - 检查策略指针有效性
	 *          - 调用策略析构函数清理资源
	 *          - 防止重复删除导致的内存错误
	 */
	virtual bool deleteStrategy(CtaStrategy* stra) override;	
};

